package com.cskaoyan.mr.wordcount;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

import java.io.IOException;

/**
 * @ClassName WordCount
 * @Description: TODO
 * @Author 远志 zhangsong@cskaoyan.onaliyun.com
 * @Date 2023/2/13 10:49
 * @Version V1.0
 **/
public class WordCount {

    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        //读取默认的配置文件
        Configuration configuration = new Configuration(true);
        //我们运行的mapreduce任务，其实对应的java类就是一个job
        Job job = Job.getInstance(configuration);

        job.setJobName("word-count");
        job.setJarByClass(WordCount.class);

        //mapreduce任务程序在执行时，输入的路径来源
        //path就是对于路径的一个封装，里面的写法和file的写法非常类似
        //但是不推荐大家使用这种写固定的路径，如果后续需要临时去修改输入路径，那么必须重新修改代码编译
//        Path inputPath = new Path("/word");
        //args表示除了运行的指令之外的第一个参数
        Path inputPath = new Path(args[0]);
        TextInputFormat.addInputPath(job, inputPath);
        //第二个参数表示输出
        Path outputPath = new Path(args[1]);
        TextOutputFormat.setOutputPath(job, outputPath);

        //当job任务的map函数
        job.setMapperClass(WordCountMapper.class);

        //map函数执行完毕之后，会有一个key,value的输出，下面是配置key和value的类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        //job任务的reduce函数
        job.setReducerClass(WordCountReducer.class);

        //等待任务执行完毕，阻塞
        job.waitForCompletion(true);
    }
}
